export class WS {
  MAX_ERROR_COUNT = 10 // 最大错误连接数

  nowErrorCount = 0 // 当前错误连接数  每次正确连接后 重置为0

  isHeartflag = false

  // socket对象
  socket = null;

  // 心跳状态  为false时不能执行操作 等待重连
  // 重连状态  避免不间断的重连操作
  isReconnect = false;

  // 是否重新连接
  reconnect = true;

  /**
   *
   * @param {
   *  url:请求域名 默认本服务器 端口8087  有url的情况下直接使用url
   *  port: 端口号
   *  hostname:请求域名
   *  path: 接口路径
   *  delay:连接失败后再次连接间隔时间
   * } options
   */
  constructor(options) {
    const config = options || {}
    // 前缀
    const protocol = (window.location.protocol === 'http:') ? 'ws://' : 'wss://'
    // IP/域名
    const hostname = config.hostname || window.location.hostname
    // 端口
    const port = config.port || window.location.port
    // 接口路径
    const path = config.path || ''
    // 接口地址url
    this.url = config.url || `${protocol + hostname}:${port}${path}`
    // 连接错误/关闭 重连接时间
    this.delay = config.delay || 5000
    // 是否重连
    this.reconnect = (config.reconnect !== undefined) ? config.reconnect : true

    this.handleAction = config.handleAction || {}

    this.handleEvent = config.handleEvent || null

    this.initWs()
  }

  initWs() {
    if (this.nowErrorCount > this.MAX_ERROR_COUNT) return
    this.nowErrorCount += 1 // 每次连接错误数加 1  连接成功重置为0
    try {
      window.WebSocket = window.WebSocket || window.MozWebSocket
      if (!window.WebSocket) { // 检测浏览器支持
        console.error('错误: 浏览器不支持websocket')
        return
      }

      this.socket = new WebSocket(this.url) // 创建连接并注册响应函数

      this.socket.onopen = (e) => {
        this.nowErrorCount = 0
        console.log('open')
        this.isHeartflag = true
        this.handleReady && this.handleReady(e)
      }

      this.socket.onmessage = (e) => {
        this.handleEvent && this.handleEvent(e)
      }

      this.socket.onclose = () => {
        this.onclose()
      }

      this.socket.onerror = (e) => {
        this.onerror && this.onerror(e)
      }

      return this
    } catch (error) {
      console.log(error)
    }
  }

  send(data, delay = true) {
    if (this.isHeartflag) {
      this.socket.send(data)
    } else if (delay) {
      setTimeout(() => {
        this.send(data)
      }, 5000)
    }
  }

  close() {
    try {
      console.log('close socket')
      this.reconnect = false // 不重新连接
      this.socket.close()
      this.socket = null // 清理
    } catch (error) {
      console.log(error)
    }
  }

  // 自定义Ws异常事件：Ws报错后触发
  onclose() {
    console.log('onclose')
    this.isHeartflag = false
    if (this.reconnect) {
      this.reConnect()
    }
  }

  // 自定义Ws异常事件：Ws报错后触发
  onerror() {
    console.log('error')
    this.isHeartflag = false
    if (this.reconnect) {
      this.reConnect()
    }
  }

  // 重新连接
  reConnect() {
    if (this.isReconnect) return
    this.isReconnect = true
    // 没连接上会一直重连，设置延迟避免请求过多
    setTimeout(() => {
      this.initWs()
      this.isReconnect = false
    }, this.delay)
  }
}
